package com.demo.flyweight11;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Vector;

//核心类

/**
 * 1、享元模式的优点：
 *
 * （1）极大减少系统中对象的个数；
 *
 * （2）由于使用了外部状态，外部状态相对独立，不会影响到内部状态，所以享元模式使得享元对象能够在不同
 * 的环境被共享。
 *
 * 2、享元模式的缺点：
 *
 * （1）由于享元模式需要区分外部状态和内部状态，使得应用程序在某种程度上来说更加复杂化了。
 *
 * （2）为了使对象可以共享，需要将享元对象的状态外部化，而读取外部状态使得运行时间变长。
 *
 * 3、适用场景：
 *
 * （1）如果系统中存在大量的相同或者相似的对象，由于这类对象的大量使用，会造成系统内存的耗费，
 * 可以使用享元模式来减少系统中对象的数量。
 *
 * （2）对象的大部分状态都可以外部化，可以将这些外部状态传入对象中。
 */
public class FlyweightFactory{

//    工厂类通常会使用集合类型来保存对象，如 HashMap、Hashtable、
//    Vector 等等，在 Java 中，
//            *      数据库连接池、线程池等都是用享元模式的应用。
    static Map<String, Shape> shapes = new HashMap<String, Shape>();

    /**
     *     享元模式的核心是享元工厂类，享元工厂类维护了一个对象存储池，当客户端需要对象时，首先从享元池中获取，
     *     如果享元池中存在对象实例则直接返回，如果享元池中不存在，则创建一个新的享元对象实例返回给用户，
     *     并在享元池中保存该新增对象，这点有些单例的意思。
     * @param key
     * @return
     */
    public static Shape getShape(String key){
        Shape shape = shapes.get(key);
        //如果shape==null,表示不存在,则新建,并且保持到共享池中

        if(shape == null){
            shape = new Circle(key);
            shapes.put(key, shape);
        }
        return shape;
    }
    
    public static int getSum(){
        return shapes.size();
    }
}